/*
 * @Author: 吴世扬 18368095041@163.com
 * @Date: 2024-05-23 11:40:09
 * @LastEditors: 吴世扬 18368095041@163.com
 * @LastEditTime: 2024-07-29 12:08:17
 * @FilePath: /vue3-uniapp/vite.config.mts
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
// vite.config.mts
import { type UserConfig, type ConfigEnv, loadEnv, defineConfig } from 'vite';
import uniModule from '@dcloudio/vite-plugin-uni';
import UnoCSS from 'unocss/vite';
import { resolve } from 'path';
import AutoImport from 'unplugin-auto-import/vite';
import Components from 'unplugin-vue-components/vite';
// https://devtools-next.vuejs.org/
import VueDevTools from 'vite-plugin-vue-devtools';

import { tuniaoUiResolver } from './src/other/componentsResolvers/tuniaoUiResolver';
import { uniUiResolver } from './src/other/componentsResolvers/uniUiResolver';
import { pnpmPathPlugin } from './src/other/esbuildPlugins/pnpmPathPlugin';
import { rollupPluginPnpmpath } from './src/other/rollupPlugins/rollupPluginPnpmpath';
// import { vitePluginConfigDebug } from './src/other/vitePlugins/vitePluginConfigDebug';
// import {
//     ElementPlusResolver,
//     DevUiResolver
// } from 'unplugin-vue-components/resolvers';

// @ts-expect-error missing types
const Uni = uniModule.default || uniModule;

const pathSrc = resolve(__dirname, 'src');
export default defineConfig(
    async ({ mode }: ConfigEnv): Promise<UserConfig> => {
        const env = loadEnv(mode, process.cwd());
        return Promise.resolve({
            resolve: {
                alias: {
                    '@': pathSrc
                },
                preserveSymlinks: false
            },
            plugins: [
                // vitePluginConfigDebug(),
                // 自动导入参考： https://github.com/sxzz/element-plus-best-practices/blob/main/vite.config.ts
                AutoImport({
                    // 自动导入 Vue 相关函数，如：ref, reactive, toRef 等
                    imports: [
                        'vue',
                        // '@vueuse/core', // uni下的vue不兼容@vueuse/core
                        'pinia',
                        'rxjs'
                        // 'vue-router',
                        // 'vue-i18n'
                    ],
                    resolvers: [
                        // 自动导入 Element Plus 相关函数，如：ElMessage, ElMessageBox... (带样式)
                        // ElementPlusResolver(),
                        // 自动导入图标组件
                        // IconsResolver({})
                    ],
                    eslintrc: {
                        // 是否自动生成 eslint 规则，建议生成之后设置 false
                        enabled: true,
                        // 指定自动导入函数 eslint 规则的文件
                        filepath: './.eslintrc-auto-import.json',
                        globalsPropValue: true
                    },
                    // 是否在 vue 模板中自动导入
                    vueTemplate: true,
                    // 指定自动导入函数TS类型声明文件路径 (false:关闭自动生成)
                    // dts: false
                    dts: 'src/typings/auto-imports.d.ts'
                }),
                Components({
                    resolvers: [
                        // 自动导入 Element Plus 组件
                        // ElementPlusResolver(),
                        // // 自动注册图标组件
                        // IconsResolver({
                        //     // element-plus图标库，其他图标库 https://icon-sets.iconify.design/
                        //     enabledCollections: ['ep']
                        // }),
                        // DevUiResolver()
                        tuniaoUiResolver(),
                        uniUiResolver()
                    ],
                    // 指定自定义组件位置(默认:src/components)
                    dirs: ['src/components', 'src/components/ui'], // 全局组件声明可以写在components.d.ts里，vite会自动生成的时候保留你的声明的
                    exclude: [/.bak$/],
                    // 指定自动导入组件TS类型声明文件路径 (false:关闭自动生成)
                    // dts: false
                    dts: 'src/typings/components.d.ts'
                }),
                UnoCSS(),
                Uni(), // uni需放在各种批处理的后面
                VueDevTools({
                    openInEditorHost: `http://localhost:${env.VITE_APP_PORT}`
                })
            ],
            server: {
                // 允许IP访问
                host: '0.0.0.0',
                // 应用端口 (默认:3000)
                port: Number(env.VITE_APP_PORT)
            },
            optimizeDeps: {
                include: ['@ant-design/colors'],
                esbuildOptions: {
                    plugins: [pnpmPathPlugin()]
                }
            },
            build: {
                rollupOptions: {
                    plugins: [rollupPluginPnpmpath()]
                }
            }
        });
    }
);
